/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import model.Curso;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

/**
 *
 * @author Rúiter
 */
public class ExtractionCursos {

    private final ArrayList<Curso> cursos;

    public ExtractionCursos() {
        this.cursos = new ArrayList<>();
    }

    public ArrayList extractCursos() {
        Document doc = null;
        try {

            try {
                //Documento que recebe o html da página a ser extraida
                doc = Jsoup.connect("http://www.dac.unicamp.br/portal/grad/cursos_regulares/cursos/").get();
            } catch (IOException ex) {    //tratamento de exceção quando a URL não existe
                appendToFile(ex);
                return null;

            } catch (Exception ex) {    //tratamento de exceção para o caso de exceção genérica
                appendToFile(ex);
                return null;
            }
            //Seleciona os elementos do HTML que contém codigo, nome e o periodo do Curso
            Elements tabela = doc.select("tr");
            for (int i = 3; i < tabela.size(); i++) {
                Elements codigo = tabela.get(i).select("th[id^=codigo-curso]").not("th[class=codigo]"); //pega o codigo
                Elements nome = tabela.get(i).select("th[id^=nome-curso]");     //pega o nome
                Elements periodo = tabela.get(i).select("th[id^=periodo-curso]").not("th[class=periodo"); //pega o periodo

                if (codigo.hasText() & nome.hasText() & periodo.hasText()) {
                    String cod = codigo.text();
                    String name = nome.text();
                    String per = periodo.text();
                    Curso c = new Curso(name, cod, per);
                    cursos.add(c);
                }
            }

        } catch (NullPointerException ex) { //tratamento de exceção para página em branco.
            appendToFile(ex);

        } catch (Exception ex) {    //tratamento de exceção para erro genérico 2.
            appendToFile(ex);

        }
        return cursos;
    }
    
    public static void appendToFile(Exception ex) {
        Date d = new Date();
        try {
            FileWriter fstream = new FileWriter("exception.txt", true);
            BufferedWriter out = new BufferedWriter(fstream);
            PrintWriter pWriter = new PrintWriter(out, true);
            pWriter.println(d + ": ");
            pWriter.println("Class: Extraction");
            ex.printStackTrace(pWriter);
            pWriter.println();
        } catch (Exception ie) {
            throw new RuntimeException("Could not write Exception to file", ie);
        }
    }

}
